package com.aizuda.boot.modules.business.negotiation.mapper;

import com.aizuda.boot.modules.business.approval.entity.vo.NegotiationListVO;
import com.aizuda.boot.modules.business.negotiation.entity.ContractNegotiationInstanceEntity;
import com.aizuda.boot.modules.business.negotiation.entity.dto.NegotiationFilterDTO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 合同协商实例Mapper接口
 */
@Mapper
public interface ContractNegotiationInstanceMapper extends BaseMapper<ContractNegotiationInstanceEntity> {
    
    /**
     * 根据筛选条件查询协商实例列表（高效SQL联查版本）
     * @param page 分页对象
     * @param filterType 筛选类型
     * @param currentUserId 当前用户ID
     * @param userTenantKeys 用户租户键列表
     * @param keyword 关键词（同时匹配合同名称、合同编号、申请人昵称）
     * @param sortField 排序字段（CONTRACT_NUMBER或START_TIME）
     * @param sortOrder 排序方向（ASC或DESC）
     * @param filters 高级筛选条件
     * @return 协商实例分页列表
     */
    Page<ContractNegotiationInstanceEntity> selectNegotiationListByFilter(
            Page<ContractNegotiationInstanceEntity> page,
            @Param("filterType") String filterType,
            @Param("currentUserId") Long currentUserId,
            @Param("userTenantKeys") List<String> userTenantKeys,
            @Param("keyword") String keyword,
            @Param("sortField") String sortField,
            @Param("sortOrder") String sortOrder,
            @Param("filters") NegotiationFilterDTO filters
    );

    /**
     * 统计用户的协商数量（带多租户隔离）
     * @param applicantId 申请人ID
     * @param tenantKey 租户键（单个租户，兼容旧版本）
     * @param tenantKeys 租户键列表（多租户）
     * @return 协商数量
     */
    Long countNegotiationsByApplicantWithTenant(
            @Param("applicantId") Long applicantId, 
            @Param("tenantKey") String tenantKey,
            @Param("tenantKeys") List<String> tenantKeys
    );

    /**
     * 查询协商列表（带条件筛选）
     * @param page 分页对象
     * @param astrictedContractIds 受限合同ID列表
     * @param userTenantKeys 用户租户键列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param contractStatus 合同状态列表
     * @return 协商列表分页数据
     */
    IPage<NegotiationListVO> selectConditionNegotiation(IPage<NegotiationListVO> page, @Param("list") List<Integer> astrictedContractIds, @Param("tenant") List<String> userTenantKeys, @Param("startTime") String startTime, @Param("endTime") String endTime,@Param("status") List<String> contractStatus);

    /**
     * 查询待我确认的协商总数
     * @param userId 用户ID
     * @param userTenantKeys 用户租户键列表
     * @return 待我确认的协商总数
     */
    Long selectPendingMyConfirmCount(@Param("userId") Long userId, @Param("userTenantKeys") List<String> userTenantKeys);
}